﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConfigurationManager.Model
{
    public class Product
    {
        public int Id
        {
            get;
            set;
        }

        public string Name
        {
            get;
            set;
        }

        public string Description
        {
            get;
            set;
        }

        public List<Model.Instance> Instances
        {
            get;
            set;
        }

        public Product()
        {
            this.Instances = new List<Instance>();
        }

        #region Métodos
        public static List<Product> Retrieve()
        {
            try
            {
                DataAccess.Product p = new DataAccess.Product();
                return p.Retrieve();
            }
            catch
            {
                throw;
            }
        }

        public static Product Retrieve(int productId)
        {
            DataAccess.Product p = new DataAccess.Product();
            return p.Retrieve(productId);
        }

        public static void Save(Product product)
        {
            if (string.IsNullOrEmpty(product.Name))
                throw new ValidationException("O nome do produto deve ser informado.");
            else if (product.Name.Length > 50)
                throw new ValidationException("O nome do produto deve ter no máximo 50 caracteres.");

            if (string.IsNullOrEmpty(product.Description))
                throw new ValidationException("A descrição do produto deve ser informada.");
            else if (product.Description.Length > 150)
                throw new ValidationException("A descrição do produto deve ter no máximo 150 caracteres.");

            DataAccess.Product p = new DataAccess.Product();

            //validar se ja existe um produco com o mesmo nome
            if (p.VerifyProductNameIntegrity(product.Id, product.Name))
                throw new ValidationException("O nome do produto informado já está em uso.");

            p.Save(product);
        }

        public static void Delete(int productId)
        {
            VerifyDependencies(productId);

            DataAccess.Product p = new DataAccess.Product();
            p.Delete(productId);
        }

        private static void VerifyDependencies(int productId)
        {
            DataAccess.Instance i = new DataAccess.Instance();
            int count = i.CountByProduct(productId);
            if (count > 0)
                throw new ValidationException("O produto não pode ser excluído pois possui instâncias associadas. Para excluir o produto, exclua antes as instâncias associadas.");
        }
        #endregion

        public static Product RetrieveByName(string productName)
        {
            DataAccess.Product p = new DataAccess.Product();
            return p.RetrieveByName(productName);
        }
    }
}
